// 引入配置
import { config } from '@/common/config.js'

import store from '@/store'
// 节流函数
function debounce(fn, delay=1000) {
    // 1.定义一个定时器, 保存上一次的定时器
    let timer = null
    // 2.真正执行的函数
    return function (...args) {
        // 取消上一次的定时器
        if (timer) clearTimeout(timer)
        // 延迟执行
        timer = setTimeout(() => {
        // 外部传入的真正要执行的函数,绑定this和参数
            fn.apply(this, args)
        }, delay)
    }
}
let loadingCount = 0
let loadingTimer = null
const addLoading = () => {
    console.log('loadingCount+++', loadingCount)
    if (loadingCount == 0) {
        uni.showLoading({
            title: 'Sending...',
            mask: true
        })
    }
    loadingCount++
}

/**
 * 自动适配不同的后端架构
 * 1. 例如 /act/oa/task ,在微服务架构保持不变,在单体架构编程 /admin/oa/task
 * 2. 特殊 /gen/xxx ,在微服务架构、单体架构编程 都需保持不变
 *
 * @param originUrl 原始路径
 */
const adaptationUrl = (originUrl) => {
    const isHttps = /^https:\/\//.test(originUrl);
    if (isHttps) {
        return originUrl;
    }
    // 微服务架构 不做路径转换,为空不做路径转换
   /*  const isMicro = import.meta.env.VITE_IS_MICRO;
    if (validateNull(isMicro) || isMicro === 'true') {
        return originUrl;
    } */
    // 转为 /admin 路由前缀的请求
    return `/admin/${originUrl?.split('/').splice(2).join('/')}`;
};

const request = (options) => {
    // console.log('options',options.url);
    // 请求路由
    options.url = adaptationUrl(options.url);
    // 请求token
    const accessToken = store.getters.GET_ACCESS_TOKEN || null
    // 请求头部
    const BaseHeader = options.header || {
        'content-type': 'application/json',
        'Accept-Language': 'en',
        'TENANT-ID': 1,
        'NeedEncode':'true',
        'skipToken':false
    };

    if (accessToken) {
        BaseHeader['Authorization'] = 'Bearer ' + accessToken
    }
    return new Promise((resolve, reject) => {
        uni.request({
            header: BaseHeader,
            method: options.method || 'GET',
            data: options.data || {},
            url: `${config.baseURL}${options.url}`,
            success(res) {
                const { statusCode, code, data } = res;
                // 判断http状态码
                if (statusCode === 200) { // 状态码为200
                    if (data.code == 0 || data.access_token) {
                        resolve(data.data || data)
                    } else {
                        debounce(function() {
                            uni.showToast({
                                title: data.msg || '系统异常，请联系管理员',
                                icon: 'none',
                                duration: 4000
                            })
                        }, 500)()
                        reject(data)
                    }
                } else if (statusCode === 424 || statusCode === 426) {
                    //  // 424 令牌状态已过期 426 租户状态已过期
                    debounce(function() {
                        uni.navigateTo({ url: '/pages/relayPage/fail' })
                    }, 500)()
                    
                    reject(data)
                } else {
                    // error.response.data.msg || '系统异常请联系管理员'
                    debounce(function() {
                        uni.showToast({
                            title: data.msg || '系统异常，请联系管理员',
                            icon: 'none',
                            duration: 4000
                        })
                    }, 500)()
                    reject(data)
                }
                
            },
            fail(err) {
                debounce(function() {
                    uni.showToast({
                        title: err.msg || '系统异常，请联系管理员',
                        icon: 'error',
                        duration: 3000,
                    })
                }, 500)()
                reject(err)
            },
            complete() {
            }
        })
    })
}

// 上传接口
export const uploadFile = (file) => {
    // 请求token
    const accessToken = store.getters.GET_ACCESS_TOKEN || null;

    return new Promise((resolve, reject)=> {
        uni.showLoading({ title: 'Uploading...',mask: true})
        let token = store.getters.accessToken || null
        uni.uploadFile({
            url: `${config.baseURL}/admin/sys-file/uploadFile`,
            file: file,
            name: 'file',
            header: {
                'TENANT-ID': 1,
                'Authorization': accessToken ? ('Bearer ' + accessToken) : ''
            },
            success(res) {
                let data = res.data
                let file = JSON.parse(data)
                console.log('code',file.code, file.code === 0);
                if (file.code === 0) {
                    console.log('success');
                    uni.showToast({title: '上传成功!', icon: 'success'})
                    resolve(file.data)
                } else {
                    console.log('err11');
                    uni.showToast({title: '系统异常，请联系管理员', icon: 'none'})
                    reject(file.msg)
                }
            },
            fail(err) {
                console.log('err22');
                uni.showToast({title: '系统异常，请联系管理员', icon: 'none'})
                reject(err)
            },
            complete() {
                uni.hideLoading()
            }
        })
    })
}
export default request
